/* 
 * File:   ListaTest.cpp
 * Author: max
 *
 * Created on Oct 6, 2012, 11:02:04 AM
 */

#include <stdlib.h>
#include <iostream>
#include <exception>
#include "Lista.h"

using namespace std;
using namespace TP::Colecciones;

/*
 * Simple C++ Test Suite
 */

void test1() {
    try
    {
        std::cout << "ListaTest Instanciar, popular y recorrer la lista." << std::endl;

        Lista lista;
        lista.Agregar(new int (3));
        
        if (3 != *(int*)lista.Primero())
            std::cout << "%TEST_FAILED% time=0 testname=test1 (ListaTest) message=El primer elemento de la lista no contiene el valor esperado." << std::endl;
        else
            cout << "Se encontro el valor agregado a la lista!" << endl;
        
        delete (int*)lista.Primero();
    }
    catch (exception& pEx)
    {
        std::cout << "%TEST_FAILED% time=0 testname=test1 (ListaTest) message=" << pEx.what() << std::endl;
    }
    
}

void test2() {
    try
    {
        std::cout << "ListaTest Instanciar, popular e iterar la lista." << std::endl;
        
        cout << "Instancio y populo la lista. " << endl;
        
        Lista lista;
        
        lista.Agregar(new int (1));
        lista.Agregar(new int (2));
        lista.Agregar(new int (3));
        lista.Agregar(new int (4));
        lista.Agregar(new int (5));
        
        cout << "Itero la lista y la imprimo por salida estandar." << endl;
        
        int* cursor = (int*) lista.Primero();
        while (NULL != cursor)
        {
            cout << *cursor << endl;
            cursor = (int*) lista.Siguiente(cursor);
        }

        cout << "Eliminos los datos contenidos en la lista." << endl;
                
        // Elimino los datos de la lista.
        while (!lista.Vacia())
        {
            int* entero = (int*) lista.Primero();
            lista.Remover(entero);
            
            cout << "Se elimina el elemento: " << *entero << endl;
            
            delete (int*) entero;
        }
        
        lista.Limpiar();
        
        cout << "Se elimino satisfactoriamente la lista.  Queda ejecutar Limpiar en el destructor de la lista." << endl;
    }
    catch (exception& pEx)
    {
        std::cout << "%TEST_FAILED% time=0 testname=test2 (ListaTest) message=" << pEx.what() << std::endl;        
    }
}

void test3() {
    try
    {
        std::cout << "ListaTest Instanciar, popular, Iterar, Limpiar e Iterar la lista." << std::endl;
        
        cout << "Instancio y populo la lista. " << endl;
        
        Lista lista;
        
        lista.Agregar(new int (1));
        lista.Agregar(new int (2));
        lista.Agregar(new int (3));
        lista.Agregar(new int (4));
        lista.Agregar(new int (5));
        
        cout << "Itero la lista y la imprimo por salida estandar." << endl;
        
        int* cursor = (int*) lista.Primero();
        while (NULL != cursor)
        {
            cout << *cursor << endl;
            cursor = (int*) lista.Siguiente(cursor);
        }

        cout << "Eliminos los datos contenidos en la lista." << endl;
                
        // Elimino los datos de la lista.
        while (!lista.Vacia())
        {
            int* entero = (int*) lista.Remover(lista.Primero());
            
            cout << "Se elimina el elemento: " << *entero << endl;

            delete (int*) entero;
        }
        
        lista.Limpiar();

        cout << "Itero la lista y la imprimo por salida estandar." << endl;
        
        cursor = (int*) lista.Primero();
        while (NULL != cursor)
        {
            cout << *cursor << endl;
            cursor = (int*) lista.Siguiente(cursor);
        }

        cout << "EXITO!!!" << endl;
    }
    catch (exception& pEx)
    {
        std::cout << "%TEST_FAILED% time=0 testname=test3 (ListaTest) message=" << pEx.what() << std::endl;        
    }
}



int main(int argc, char** argv) {
    std::cout << "%SUITE_STARTING% ListaTest" << std::endl;
    std::cout << "%SUITE_STARTED%" << std::endl;

    std::cout << "%TEST_STARTED% test1 (ListaTest)" << std::endl;
    test1();
    std::cout << "%TEST_FINISHED% time=0 test1 (ListaTest)" << std::endl;

    std::cout << "%TEST_STARTED% test2 (ListaTest)\n" << std::endl;
    test2();
    std::cout << "%TEST_FINISHED% time=0 test2 (ListaTest)" << std::endl;

    
    std::cout << "%TEST_STARTED% test3 (ListaTest)\n" << std::endl;
    test3();
    std::cout << "%TEST_FINISHED% time=0 test3 (ListaTest)" << std::endl;
    
    std::cout << "%SUITE_FINISHED% time=0" << std::endl;

    return (EXIT_SUCCESS);
}

